package com.blog.cloud.core.comfig;

import com.blog.cloud.core.properties.ThreadPoolProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@ConditionalOnProperty(prefix = "thread.pool", value = "enabled", havingValue = "true")
@EnableConfigurationProperties(value = {ThreadPoolProperties.class})
public class ThreadPoolConfig {

    // 不推荐这样做，SpringBoot 默认会自动创建一个 ThreadPoolTaskExecutor 线程池
    @Bean
    public ThreadPoolExecutor threadPoolExecutor(ThreadPoolProperties properties) {
        return new ThreadPoolExecutor(
                properties.getCorePoolSize(),
                properties.getMaximumPoolSize(),
                properties.getKeepAliveTime(),
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(properties.getQueueCapacity()));
    }
}

// 为了让线程池的配置数据能够从配置文件中批量导入，我们可以创建一个映射类并使用配置文件处理器完成
// 例如：创建线程池配置文件 ThreadPoolProperties


// Spring 的 ThreadPoolTaskExecutor 实际上是 Java 标准库中 ThreadPoolExecutor 的一个封装，提供了更多便捷的配置选项，并且更好地与 Spring 框架集成。我们可以通过 spring.task.execution.pool 属性来自定义配置
// SpringBoot 任务执行和调度，ThreadPoolTaskExecutor 参考官方文档 https://docs.springjava.cn/spring-boot/reference/features/task-execution-and-scheduling.html